package com.atguigu.yygh.user.controller;

import com.atguigu.yygh.hosp.globalexp.YyghException;
import com.atguigu.yygh.hosp.result.R;
import com.atguigu.yygh.hosp.util.JwtHelper;
import com.atguigu.yygh.model.user.UserInfo;
import com.atguigu.yygh.user.service.UserInfoService;
import com.atguigu.yygh.vo.user.LoginVo;
import com.atguigu.yygh.vo.user.UserAuthVo;
import com.atguigu.yygh.vo.user.UserInfoQueryVo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriTemplateHandler;

import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/api/user")
public class UserInfoController {
    @Autowired
    UserInfoService userInfoService;

    @Autowired
    RestTemplate restTemplate;
    /**
     * 对用户的信息进行校验(根据用户的id校验用户信息)
     */
    @GetMapping("/checkUserAuthStatus/{userId}")
    public R checkUserAuthStatus(@PathVariable Long userId){
       boolean b = userInfoService.checkUserAuthStatus(userId);
       return (b==true)?R.ok().message("认证通过"):R.ok().message("认证不通过");
    }
    /**
     * 修改用户的认证状态
     */
    @GetMapping("/updateAuthStatus/{userId}/{authStatus}")
    public R updateAuthStatus(@PathVariable Long userId,@PathVariable Integer authStatus){
        userInfoService.updateAuthStatus(userId,authStatus);
        return R.ok();
    }

    /**
     * 根据用户的id查询 就诊人列表+用户信息
     * 点击用户列表点击详情按钮
     */
    @GetMapping("/getById/{id}")
    public R getById(@PathVariable Long id){
        Map map = userInfoService.getUserDetail(id);
        return R.ok().data(map);
    }

    /**
     * 用户的锁定与解锁
     */
    @GetMapping("/updateStatus/{userId}/{status}")
    public R updateStatus(@PathVariable Long userId,@PathVariable Integer status){
        userInfoService.updateStatus(userId,status);
        return R.ok();
    }


    /**
     * 带条件的分页查询
     */
    @PostMapping("/selectPage/{pageNum}/{pageSize}")
    public R selectPage(@PathVariable("pageNum") Integer pageNum,
                        @PathVariable("pageSize") Integer pageSize,
                        @RequestBody UserInfoQueryVo queryVo){

        //带条件的分页查询
      Page<UserInfo> page = userInfoService.selectPage(pageNum,pageSize,queryVo);

      //mybatis-plus中的page分页结果对象,包括records属性
        List<UserInfo> records = page.getRecords();
        long total = page.getTotal();  //total属性
        return R.ok().data("list",records).data("total",total);
    }

    /**
     * 用户提交认证信息
     */
    @PostMapping("/userAuth")
    public R userAuth(@RequestBody UserAuthVo userAuthVo,HttpServletRequest request){
        String token = request.getHeader("token");
        if(!StringUtils.isEmpty(token)){
            Long userId = JwtHelper.getUserId(token);
            //根据用户id更新用户的认证信息
            userInfoService.userAuth(userId,userAuthVo);
        }

        return R.ok();
    }


    /**
     * 查询当前用户信息
     * 从请求头中获取后端传递的令牌,解析令牌中的用户id,根据用户的id查询当前的用户信息
     */
    @GetMapping("/getUserInfo")
    public R getUserInfo(HttpServletRequest request){
        String token = request.getHeader("token");
        if(!StringUtils.isEmpty(token)){
            Long userId = JwtHelper.getUserId(token);
            UserInfo userInfo = userInfoService.getByUserId(userId);
            return R.ok().data("userInfo",userInfo);
        }
        return R.ok().data("userInfo",null);
    }



    /**
     * 1.对参数值进行非空校验,为空则抛出自定义异常(手机号和验证码)
     * 2.从redis中根据手机号作为key,获取value,value就是这个手机号正确的验证码
     * 3.将用户输入的验证码code和redis中的验证码做校验,校验失败,抛出自定义异常
     * 4.根据手机号去user_info表中查询该手机号用户是否存在
     * 5.如果不存在,利用手机号自动注册
     * 6.无论是刚刚自动注册的用户还是以前就存在的手机号用户,都要判断用户的锁定状态,如果status=0,抛出自定义异常,不允许登录
     * 7.返回值格式:{code,success,message,data:{name,token}}
     * 登录后右上角显示的字符串--name
     *     优先取userInfo中的name  (name是用户名)
     *     如果name为空取nickname  (nickname是微信名)
     *     如果nickname为空取userInfo中的phone (手机号)
     *
     *   token是利用用户的id和name生成一个jwt格式的令牌
     *   用户登录成功后的一个身份标识,前端会将token令牌存储到cookie中
     * @param loginVo
     * @return
     */
    //用户在挂号网站实现手机号+短信验证码登录


    /**
     * 微信扫码后,绑定手机号,最终也调用到了该接口
     * 可以根据openid来判断,如果openid有值就是微信扫码登录的,
     * 如果openid没有值就是手机号+验证码登录的
     * @param loginVo
     * @return
     */
    @PostMapping("/login")
    public R login(@RequestBody LoginVo loginVo){
        String openid = loginVo.getOpenid();
        if(StringUtils.isEmpty(openid)){
            //手机号+验证码登录
            Map map=userInfoService.login(loginVo);
            return R.ok().data(map);
        }else {
            //微信扫码登录
            Map map=userInfoService.boundlePhone(loginVo);
            return R.ok().data(map);
        }

        //return R.ok().data("name","").data("token","");
    }


    @GetMapping("/findAll")
    public List<UserInfo> findAll(){
        List<UserInfo> list = userInfoService.list();
        return list;
    }
}
